package com.chatroom.server;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 聊天室核心管理类。
 * 这是一个单例或由 Server 主类持有的实例。
 * 它负责管理所有客户端连接，并处理消息的广播。
 * 遵循单一职责原则，将客户端管理逻辑从 Server 主类中分离出来。
 */
public class ChatRoom {

    // 使用线程安全的List来存储所有客户端处理器
    private final List<ClientHandler> clients = Collections.synchronizedList(new ArrayList<>());

    /**
     * 当一个新客户端成功初始化并加入时调用此方法。
     * @param client 新加入的客户端处理器。
     */
    public synchronized void addClient(ClientHandler client) {
        clients.add(client);
        System.out.println(client.getNickname() + " 已加入聊天室。当前在线人数: " + clients.size());
        // 广播新成员加入的系统消息
        broadcastMessage("SYS:" + client.getNickname() + " 已加入聊天室。", null);
    }

    /**
     * 当一个客户端断开连接时调用此方法。
     * @param client 离开的客户端处理器。
     */
    public synchronized void removeClient(ClientHandler client) {
        boolean removed = clients.remove(client);
        if (removed) {
            System.out.println(client.getNickname() + " 已离开聊天室。当前在线人数: " + clients.size());
            // 广播成员离开的系统消息
            broadcastMessage("SYS:" + client.getNickname() + " 已离开聊天室。", null);
        }
    }

    /**
     * 向聊天室中的客户端广播消息。
     * @param message 要广播的消息内容。
     * @param excludeClient 要排除的客户端（通常是消息的发送者），如果为 null，则发送给所有人。
     */
    public void broadcastMessage(String message, ClientHandler excludeClient) {
        // 使用同步块来保证遍历过程中的线程安全
        synchronized (clients) {
            for (ClientHandler client : clients) {
                if (client != excludeClient) {
                    client.sendMessage(message);
                }
            }
        }
    }
}
